#include "stm32f4xx.h"                  // Device header


void MySerial_Init()
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);  // 使能 USART2 时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);   // 使能 GPIOA 时钟
	
	GPIO_InitTypeDef GPIO_InitStruct;
	// 配置 PA2 (TX) 和 PA3(RX) 为 USART 功能
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;           // 复用功能
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;      
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;         // 推挽输出
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;           // 上拉

		// 配置 GPIO 引脚为 USART2 的复用功能
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_USART2); // PA2 对应 USART2_TX
	GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_USART2); // PA3对应 USART2_RX
	
	
	// 初始化 GPIOA 引脚
	GPIO_Init(GPIOA, &GPIO_InitStruct);


	USART_InitTypeDef USART_InitStruct;
	
	
	// 配置 USART2
	USART_InitStruct.USART_BaudRate = 9600;                              // 波特率: 9600
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;             // 数据位: 8位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;                  // 停止位: 1位
	USART_InitStruct.USART_Parity = USART_Parity_No;                     // 无校验位
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 无硬件流控制
	USART_InitStruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;         // 使能发送和接收

	// 初始化 USART2
	USART_Init(USART2, &USART_InitStruct);

	// 使能 USART2 外设
	USART_Cmd(USART2, ENABLE);
}

void USART_SendByte(USART_TypeDef* USARTx,uint8_t Data)
{
	
        // 发送一个字符
        USART_SendData(USARTx,Data);
        
        // 等待数据寄存器为空
        while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);
	
}

void USART_SendString(USART_TypeDef* USARTx,uint8_t *str)
{
	
        // 发送一个字符
				while(*str!='\0')
        USART_SendByte(USARTx,*str++);
	
}


uint16_t USART_ReceiveChar(USART_TypeDef* USARTx)
{
    // 等待接收到数据
    while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);
    
    // 返回接收到的数据
    return USART_ReceiveData(USARTx);
}
